iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0
自我挑戰組

滿滿的紅寶石不拿嗎?-- 去吧!我把世界上的一切都放在那裡了! 系列 第 14

類別方法 <> 雜魚們!為革命軍獻出你們的心臟吧! - 滿滿的紅寶石不拿嗎?

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20200923/20128363fMf7riXQNQ.jpg

[Day14] 大家認識這位嗎?革命軍「東軍」軍隊長-貝洛貝蒂,她的鼓舞果實能力可以讓周遭的人全都變成有戰鬥力的單位,簡直就是類別方法啊!

在看完昨天有趣的模組後,今天想要重新回到類別(Class)這個大主題,來跟大家介紹類別方法和實體方法的差異。

那就開始吧!


實體方法

顧名思義,實體方法(instance method)就是作用在實體上的方法。基本上,類別裡面一般都會是實體方法,但我這邊還是重新快速帶一下觀念。

舉個例子,像是知名的電商網站叫 Shopee,在這個網站註冊的會員,都可以使用 Shopee 提供的服務:購買商品、上架販售等等。

我們來看看程式會怎麼寫上面這段話:

class Shopee
  def buyer
    puts "成為買家,在雙11掃光所有的貨!"
  end
  
  def seller
    puts "成為賣家,所有的錢都進來我的口袋!"
  end
end

me = Shopee.new

me.buyer
me.seller

# 印出
成為買家,在雙11掃光所有的貨!"
成為賣家,所有的錢都進來我的口袋!

類別方法

要定義類別方法有好幾種方式,我最常用的是在方法名稱的前加上 self.

class Army
  def fight # 實體方法
    puts "我要打倒天龍人!"
  end
  
  def self.inspire # 類別方法
    puts "全部的人都起身戰鬥!"
  end
end

soldier = Army.new 

soldier.fight
Army.inspire 

# 印出
我要打倒天龍人!
全部的人都起來戰鬥!

如果要定義很多類別方法,也可以這樣寫:

class Army
  class << self # 這行以下寫的方法就是類別方法,前面不用再加 self
    def all
      # ...
    end     # 一直到這
  end
end

為什麼要有類別方法?什麼時候用?

通常我們要直接請類別幫忙時,就會使用類別方法。換句話說,當我們確定這個方法和特定實體不會有關係,而是要在整個類別操作,就會考慮使用類別方法。


初始化

最後,來向大家介紹一個特別的方法「初始化(initialize)」這又是什麼?很像是重灌電腦時才會聽到的單字,是不是覺得有點危險呢?

其實在 Ruby 的類別裡, initialize 指的是:在類別產生實體當下就會立刻執行的方法,也可以想成是寶寶一出生就會做的第一件事(?)

class Baby
  def initialize
    puts "Hello World(crying!!!)"
  end
end

baby = Baby.new
Hello World(crying!!!)

Wow!寶寶一出生就會 Hello World了!看來絕對是當工程師的料啊!
(喂!寶寶在哭了!!!)


今天就先到這邊了!希望大家都有看懂類別方法在做什麼,也希望五倍的大家可以順利完賽!(信心喊話)

參考資料:
蒼時弦也 - 自由的 Ruby 類別(一)


上一篇
模組 <> 想得到夢寐以求的惡魔果實能力嗎?先裝一個吧! - 滿滿的紅寶石不拿嗎?
下一篇
存取限制 <> 原來是海樓石!惡魔果實能力者的剋星 - 滿滿的紅寶石不拿嗎?
系列文
滿滿的紅寶石不拿嗎?-- 去吧!我把世界上的一切都放在那裡了! 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言